package plp.imperative1.command;

import java.util.ArrayList;
import java.util.List;

import plp.expressions2.memory.IdentificadorJaDeclaradoException;
import plp.expressions2.memory.IdentificadorNaoDeclaradoException;
import plp.imperative1.memory.AmbienteCompilacaoImperativa;
import plp.imperative1.memory.AmbienteExecucaoImperativa;
import plp.imperative1.memory.EntradaVaziaException;

public class SequenciaComandos implements Comando{

    private List<Comando> comandos = new ArrayList<Comando>();
    private Comando comando2;
    
    public SequenciaComandos(){
    }
    
    public void add(Comando comando) {
    	comandos.add(comando);
    }
    
    /**
     * Executa os comandos sequencialmente.
     *
     * @param ambiente o ambiente de execu��o.
     *
     * @return o ambiente depois de modificado pela execu��o
     * dos comandos.
     * @throws InterruptedException 
     *
     */    
    public AmbienteExecucaoImperativa executar(AmbienteExecucaoImperativa ambiente) 
        throws IdentificadorJaDeclaradoException, IdentificadorNaoDeclaradoException,
               EntradaVaziaException, InterruptedException {
    	for (Comando c: comandos) {
    		ambiente = c.executar(ambiente);
    	}
        return ambiente;
    }

    /**
     * Realiza a verificacao de tipos dos comandos
     *
     * @param ambiente o ambiente de compila��o.
     * @return <code>true</code> se os comandos s�o bem tipados;
     *          <code>false</code> caso contrario.
     */
    public boolean checaTipo(AmbienteCompilacaoImperativa ambiente) 
        throws IdentificadorJaDeclaradoException, IdentificadorNaoDeclaradoException,
               EntradaVaziaException {
    	for (Comando c: comandos) {
    		if (!c.checaTipo(ambiente))
    			return false;
    	}
        return true;
    }
}
